#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/27 17:57
# @Author  : 朱宽
# @File    : parseElementLocator.py
# @Software: Win10、Python3.8.5 and Pycharm
'''
用于解析配置文件，并获取页面元素定位表达式
'''
from configparser import ConfigParser  # 从python的configparser模块中引入ConfigParser 类
from selenium.webdriver.support.wait import WebDriverWait  # 显示等待
from selenium.webdriver.common.by import By
from config.globalConfig import page_element_folder_path


class parseConfigFile():
    '''
    定义解析文件的类
    '''

    def __init__(self, driver, page_element_file_name):
        '''
        初始化解析文件类
        :param driver:  # 传入 webdriver.Chrome()，webdriver.Ie()，webdriver.Firefox() 这3类中的一个
        :param page_element_file_name:  # 存储页面定位元素表达式的配置文件名称
        '''
        self.driver = driver
        self.cf = ConfigParser()
        self.page_element_file_path = page_element_folder_path + page_element_file_name  # 存储页面定位元素表达式的配置文件
        self.cf.read(self.page_element_file_path, encoding='utf-8')
        self.locationTypeDict = {
            "xpath": By.XPATH,
            "id": By.ID,
            "name": By.NAME,
            "css_selector": By.CSS_SELECTOR,
            "class_name": By.CLASS_NAME,
            "tag_name": By.TAG_NAME,
            "link_text": By.LINK_TEXT,
            "partial_link_text": By.PARTIAL_LINK_TEXT
        }

    def get_items_section(self, section_name):  # 查看section下的键对值
        '''
        获取配置文件中指定section下的所有option_name键对值，并以字典类型返回给调用者。
        注意：使用self.cf.items(sectionName)此种方法获取到配置文件中的options内容均
        被转换成小写，如 login Page.frame将被转换成login page.frame
        :param section_name:
        :return:options_dict    #返回一个字典
        '''
        options_dict = dict(self.cf.items(section_name))
        return options_dict  # 返回一个字典

    # option->选项
    def get_option_value(self, section_name, option_name):
        '''
        获取指定section下的指定option的值
        :param section_name:
        :param option_name:
        :return: value  #返回指定的值,字符串
        '''
        value = self.cf.get(section=section_name, option=option_name)
        return value

    def get_element_location(self, section_name, option_name):
        '''
        获取页面元素定位表达式，并以元素对象的形式返回给调用者
        :param section_name:
        :param option_name:
        :return:element   #返回 已经被定位 的元素，可以直接进行各种操作
        '''
        driver = self.driver
        location = self.get_option_value(section_name, option_name)
        location_type = location.split(">", 1)[0]  # 采用split函数分割字符串(只分割第一个)，分割标识符 > ,然后将分割后形成的数组赋值给这个变量
        location_expression = location.split(">", 1)[1]  # 采用split函数分割字符串(只分割第一个)，分割标识符 > ,然后将分割后形成的数组赋值给这个变量
        print("元素定位类型为：" + location_type + "\t\t\t元素定位信息为：" + location_expression)
        try:
            if location_type.lower() in self.locationTypeDict:
                # 结合显示等待，获取元素
                element = WebDriverWait(driver, 60).until(
                    lambda x: x.find_element(self.locationTypeDict[location_type.lower()], location_expression))
            else:
                raise TypeError(u"未找到定位方式，请确认定位方法是否正确")
        except Exception as e:
            return 'timed out！\n\tsection_name为：{}\n\toption_name为：{}'.format(section_name,option_name)
        return element

    def highlight_element(self, driver, element):
        '''
        调用JS，用于高亮控件
        :param driver:
        :param element:
        :return:
        '''
        driver.execute_script("arguments[0].setAttribute('style',arguments[1]);", element,
                              "background:yellow;border:2px solid red;")


if __name__ == '__main__':
    from src.utils.browserController import browserController
    from config.globalConfig import page_element_folder_path
    from src.utils.simulateUserInput import elementSendKeys
    import time

    browser_type = 'edge'
    url = "https://www.baidu.com"
    file_name = "page_element_locating_information.ini"
    send_key=elementSendKeys()
    key='我们是共产主义接班人'

    browser_controller = browserController()
    driver = browser_controller.driver_browser(browser_type, url)

    my_ParseConfigFile = parseConfigFile(driver, page_element_file_name=file_name)
    my_element = my_ParseConfigFile.get_element_location('main_baidu', 'input_search')
    time.sleep(2)
    send_key.send_keys(element=my_element,content=key)
    time.sleep(2)
    my_element=my_ParseConfigFile.get_element_location('main_baidu', 'button_search')
    my_element.click()
    time.sleep(5)
    browser_controller.quit_browser(driver)
